import router from '@/router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { ElMessage } from 'element-plus'
import { whiteList } from '@/router/routes'
import { useUserStore } from '@/stores/user'
import { usePermissionStore } from '@/stores/permission'

NProgress.configure({ showSpinner: false })

let isLoadingRoutes = false  // ✅ 简单的并发控制标志

router.beforeEach(async (to, from, next) => {
  NProgress.start()

  const userStore = useUserStore()
  const permissionStore = usePermissionStore()

  // ✅ 有 token
  if (userStore.token) {
    // 已登录访问登录页，跳到首页
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
      return
    }

    // 白名单直接放行
    if ((whiteList as string[]).includes(to.path)) {
      next()
      NProgress.done()
      return
    }

    // ✅ 核心逻辑：判断是否已加载用户信息和路由
    // 修复：检查动态路由是否已加载，而不是检查 roles 是否为空
    // 因为登录时已经设置了 roles，但动态路由可能还没有加载
    if (!permissionStore.menuLoaded || userStore.roles.length === 0) {
      // ✅ 并发控制：避免多次加载
      if (isLoadingRoutes) {
        next(false)
        NProgress.done()
        return
      }

      isLoadingRoutes = true
      try {
        // 1️⃣ 获取用户信息（如果还没有）
        if (userStore.roles.length === 0) {
          await userStore.getUserInfo()
        }
        
        // 2️⃣ 生成动态路由
        await permissionStore.generateRoutes()
        
        // 3️⃣ hack方法 确保addRoutes已完成
        next({ ...to, replace: true })
      } catch (err: any) {
        console.error('加载用户信息或路由失败:', err)
        await userStore.logout()
        ElMessage.error(err.message || '加载失败，请重新登录')
        next('/login')
      } finally {
        isLoadingRoutes = false
        NProgress.done()
      }
      return
    }

    // ✅ 已加载，直接放行
    next()
  } else {
    // ✅ 没有token：白名单放行，否则跳登录
    if ((whiteList as string[]).includes(to.path)) {
      next()
    } else {
      next(`/login?redirect=${encodeURIComponent(to.fullPath)}`)
    }
    NProgress.done()
  }
})

router.afterEach(() => {
  NProgress.done()
})
